package scc.Dao;

import scc.Entidade.Membro;
import scc.Entidade.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import scc.Entidade.CidadeEstado;

public class UserDAO extends GenericDAO{
    
    public void addUser(Usuario usuario) throws SQLException{
        String query = "INSERT INTO USUARIOS (NOME, LOGIN, SENHA, STATUS, DT_CRIACAO) VALUES (?,?,?,?,GETDATE())";
        executeCommand(query, usuario.getNome(),usuario.getLogin(),usuario.getSenha(),0);
    }
    
    public boolean validaLogon(String loginUsuario, String senhaUsuario) throws SQLException{
        boolean toReturn = false;
        ResultSet rs = executeQuery("SELECT * FROM USUARIOS WHERE LOGIN=? AND SENHA=?", loginUsuario, senhaUsuario);
        if (rs.next()){
            toReturn = true;
        }
        rs.close();
        return toReturn;
    }

    public void alteraSenha(String loginUsuario, String novaSenha) throws SQLException{
        String query = "UPDATE USUARIOS SET SENHA=? WHERE LOGIN=?";
        executeCommand(query, novaSenha, loginUsuario);
    }
    
    public Usuario obterDadosUsuario(String loginUsuario) throws SQLException{
        
        ResultSet rs = executeQuery("SELECT ID, NOME, SENHA, STATUS, DT_CRIACAO  FROM dbo.USUARIOS WHERE LOGIN=?", loginUsuario);
        Usuario usuario = new Usuario();
        while (rs.next()){
            usuario.setId(rs.getInt("ID"));
            usuario.setNome(rs.getString("NOME"));
            usuario.setSenha(rs.getString("SENHA"));
            usuario.setStatus(rs.getInt("STATUS"));
            usuario.setDt_criacao(rs.getDate("DT_CRIACAO"));
        }
        usuario.setLogin(loginUsuario);
        rs.close();
        return usuario;
    }
    
    public Membro consultarMembro(int id) throws SQLException{
        Membro membro = new Membro();
        
        ResultSet rs = executeQuery("SELECT "+
                                            "*, "+
                                            "(SELECT NOME FROM IGREJAS I WHERE ID_IGREJA = I.id) IGREJA, "+
                                            "(SELECT TIPO FROM IGREJAS I WHERE ID_IGREJA = I.id) TIPO_IGREJA "+
                                    "FROM MEMBROS "+
                                    "WHERE ID = ?", id);
        
        while (rs.next()){
            membro.setId(rs.getInt("ID"));
            membro.setNome(rs.getString("NOME"));
            membro.setNacionalidade(rs.getString("NACIONALIDADE"));
            membro.setNaturalidade(rs.getString("NATURALIDADE"));
            membro.setNome_mae(rs.getString("NOME_MAE"));
            membro.setNome_pai(rs.getString("NOME_PAI"));            
            membro.setProfissao(rs.getString("PROFISSAO"));
            membro.setEstado_civil(rs.getString("ESTADO_CIVIL"));
            membro.setData_nascimento(rs.getTimestamp("DATA_NASCIMENTO"));
            membro.setData_ingresso(rs.getTimestamp("DATA_INGRESSO"));
            membro.setData_batismo(rs.getTimestamp("DATA_BATISMO"));
            membro.setData_consagracao(rs.getTimestamp("DATA_CONSAGRACAO"));
            membro.setData_cadastro(rs.getTimestamp("DATA_CADASTRO"));
            membro.setIgreja_batismo(rs.getString("IGREJA_BATISMO"));
            membro.setIgreja_consagracao(rs.getString("IGREJA_CONSAGRACAO"));
            membro.setCargo_ultima_igreja(rs.getString("CARGO_ULTIMA_IGREJA"));
            membro.setCargo_atual(rs.getString("CARGO_ATUAL"));
            membro.setLogradouro(rs.getString("LOGRADOURO"));
            membro.setBairro(rs.getString("BAIRRO"));
            membro.setMunicipio(rs.getString("MUNICIPIO"));
            membro.setEstado(rs.getString("ESTADO"));
            membro.setNumero(rs.getString("NUMERO"));
            membro.setComplemento(rs.getString("COMPLEMENTO"));
            membro.setCep(rs.getString("CEP"));
            membro.setIdentidade(rs.getString("IDENTIDADE"));
            membro.setCpf(rs.getString("CPF"));
            membro.setTelefone_residencial(rs.getString("TELEFONE_RESIDENCIAL"));
            membro.setTelefone_celular(rs.getString("TELEFONE_CELULAR"));
            membro.setEmail(rs.getString("EMAIL"));
            membro.setIdIgreja(rs.getInt("ID_IGREJA"));
            membro.setIgreja(rs.getString("IGREJA"));
            membro.setTipoIgreja(rs.getString("TIPO_IGREJA"));
        }        
        rs.close();        
        return membro;
    }
    
    public void cadastrarMembro(Membro membro){
        try {
            String query = "INSERT INTO MEMBROS ("
                    + "NOME,NACIONALIDADE,"
                    + "NATURALIDADE,"
                    + "NOME_MAE,"
                    + "NOME_PAI,"
                    + "PROFISSAO,"
                    + "ESTADO_CIVIL,"
                    + "DATA_NASCIMENTO,"
                    + "DATA_INGRESSO,"
                    + "DATA_BATISMO,"
                    + "DATA_CONSAGRACAO,"
                    + "DATA_CADASTRO,"
                    + "IGREJA_BATISMO,"
                    + "IGREJA_CONSAGRACAO,"
                    + "CARGO_ULTIMA_IGREJA,"
                    + "CARGO_ATUAL,"
                    + "LOGRADOURO,"
                    + "BAIRRO,"
                    + "MUNICIPIO,"
                    + "ESTADO,"
                    + "NUMERO,"
                    + "COMPLEMENTO,"
                    + "CEP,"
                    + "IDENTIDADE,"
                    + "CPF,"
                    + "TELEFONE_RESIDENCIAL,"
                    + "TELEFONE_CELULAR,"
                    + "EMAIL,"
                    + "ID_IGREJA) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";            
            String dataBatismo = null;
            if (membro.getData_batismo() != null) {
                dataBatismo = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_batismo());
            }
            String dataConsagracao = null;
            if (membro.getData_consagracao() != null) {
                dataConsagracao = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_consagracao());
            }
            String cargoAtual = null;
            if (!membro.getCargo_atual().equals("")) {
                cargoAtual = membro.getCargo_atual();
            }            
            executeCommand(query,
                    membro.getNome(),
                    membro.getNacionalidade(),
                    membro.getNaturalidade(),
                    membro.getNome_mae(),
                    membro.getNome_pai(),
                    membro.getProfissao(),
                    membro.getEstado_civil(),
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_nascimento()),
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_ingresso()),
                    dataBatismo,
                    dataConsagracao,
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_cadastro()),
                    membro.getIgreja_batismo(),
                    membro.getIgreja_consagracao(),
                    membro.getCargo_ultima_igreja(),
                    cargoAtual,
                    membro.getLogradouro(),
                    membro.getBairro(),
                    membro.getMunicipio(),
                    membro.getEstado(),
                    membro.getNumero(),
                    membro.getComplemento(),
                    membro.getCep(),
                    membro.getIdentidade(),
                    membro.getCpf(),
                    membro.getTelefone_residencial(),
                    membro.getTelefone_celular(),
                    membro.getEmail(),
                    membro.getIdIgreja());
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro: "+ex.getMessage());
        }
    }
    
    public void atualizarMembro(Membro membro){
        try {
            String query = "UPDATE MEMBROS "
                    + "SET NOME = ?"
                    + ", NACIONALIDADE = ?"
                    + ", NATURALIDADE = ?"
                    + ", NOME_MAE = ?"
                    + ", NOME_PAI = ?"
                    + ", PROFISSAO = ?"
                    + ", ESTADO_CIVIL = ?"
                    + ", DATA_NASCIMENTO = ?"
                    + ", DATA_INGRESSO = ?"
                    + ", DATA_BATISMO = ?"
                    + ", DATA_CONSAGRACAO = ?"
                    + ", DATA_CADASTRO = ?"
                    + ", IGREJA_BATISMO = ?"
                    + ", IGREJA_CONSAGRACAO = ?"
                    + ", CARGO_ULTIMA_IGREJA = ?"
                    + ", CARGO_ATUAL = ?"
                    + ", LOGRADOURO = ?"
                    + ", BAIRRO = ?"
                    + ", MUNICIPIO = ?"
                    + ", ESTADO = ?"
                    + ", NUMERO = ?"
                    + ", COMPLEMENTO = ?"
                    + ", CEP = ?"
                    + ", IDENTIDADE = ?"
                    + ", CPF = ?"
                    + ", TELEFONE_RESIDENCIAL = ?"
                    + ", TELEFONE_CELULAR = ?"
                    + ", EMAIL = ?"
                    + ", ID_IGREJA = ?"
                    + " WHERE ID = ?";
            System.out.println(query);
            String dataBatismo = null;
            if (membro.getData_batismo() != null) {
                dataBatismo = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_batismo());
            }
            String dataConsagracao = null;
            if (membro.getData_consagracao() != null) {
                dataConsagracao = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_consagracao());
            }
            String cargoAtual = null;
            if (!membro.getCargo_atual().equals("")) {
                cargoAtual = membro.getCargo_atual();
            }            
            executeCommand(query,
                    membro.getNome(),
                    membro.getNacionalidade(),
                    membro.getNaturalidade(),
                    membro.getNome_mae(),
                    membro.getNome_pai(),
                    membro.getProfissao(),
                    membro.getEstado_civil(),
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_nascimento()),
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_ingresso()),
                    dataBatismo,
                    dataConsagracao,
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_cadastro()),
                    membro.getIgreja_batismo(),
                    membro.getIgreja_consagracao(),
                    membro.getCargo_ultima_igreja(),
                    cargoAtual,
                    membro.getLogradouro(),
                    membro.getBairro(),
                    membro.getMunicipio(),
                    membro.getEstado(),
                    membro.getNumero(),
                    membro.getComplemento(),
                    membro.getCep(),
                    membro.getIdentidade(),
                    membro.getCpf(),
                    membro.getTelefone_residencial(),
                    membro.getTelefone_celular(),
                    membro.getEmail(),
                    membro.getIdIgreja(),
                    membro.getId());
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro: "+ex.getMessage());
        }
    }    
    
    public void atualizarMembro2(Membro membro){
        try {
            String dataBatismo = null;
            if (membro.getData_batismo() != null) {
                dataBatismo = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_batismo());
            }
            String dataConsagracao = null;
            if (membro.getData_consagracao() != null) {
                dataConsagracao = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_consagracao());
            }
            String cargoAtual = null;
            if (!membro.getCargo_atual().equals("")) {
                cargoAtual = membro.getCargo_atual();
            }            
            String query = "UPDATE MEMBROS "
                + "SET NOME = " + membro.getNome()
                + ", NACIONALIDADE = " + membro.getNacionalidade()
                + ", NATURALIDADE = " + membro.getNaturalidade()
                + ", NOME_MAE = " + membro.getNome_mae()
                + ", NOME_PAI = " + membro.getNome_pai()
                + ", PROFISSAO = " + membro.getProfissao()
                + ", ESTADO_CIVIL = " + membro.getEstado_civil()
                + ", DATA_NASCIMENTO = " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_nascimento())
                + ", DATA_INGRESSO = " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_ingresso())
                + ", DATA_BATISMO = " + dataBatismo
                + ", DATA_CONSAGRACAO = " + dataConsagracao
                + ", DATA_CADASTRO = " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(membro.getData_cadastro())
                + ", IGREJA_BATISMO = " + membro.getIgreja_batismo()
                + ", IGREJA_CONSAGRACAO = " + membro.getIgreja_consagracao()
                + ", CARGO_ULTIMA_IGREJA = " + membro.getCargo_ultima_igreja()
                + ", CARGO_ATUAL = " + cargoAtual
                + ", LOGRADOURO = " + membro.getLogradouro()
                + ", BAIRRO = " + membro.getBairro()
                + ", MUNICIPIO = " + membro.getMunicipio()
                + ", ESTADO = " + membro.getEstado()
                + ", NUMERO = " + membro.getNumero()
                + ", COMPLEMENTO = " + membro.getComplemento()
                + ", CEP = " +  membro.getCep()
                + ", IDENTIDADE = " + membro.getIdentidade()
                + ", CPF = " + membro.getCpf()
                + ", TELEFONE_RESIDENCIAL = " + membro.getTelefone_residencial()
                + ", TELEFONE_CELULAR = " + membro.getTelefone_celular()
                + ", EMAIL = " + membro.getEmail()
                + " WHERE ID = " + membro.getId();            
            executeCommand(query);
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Erro: "+ex.getMessage());
        }
    }        
    
    public int proximoNumeroCadastro() throws SQLException{
        int num =0;
        ResultSet rs = executeQuery("select MAX(id) ID from MEMBROS");
        while (rs.next()){
            num = rs.getInt("ID");
        }        
        rs.close();
        num++;
        return num;
    }
        
    public List<Membro> carregarListaMembros() throws SQLException{
        List<Membro> listaMembro = new ArrayList<Membro>();        
        ResultSet rs = executeQuery("select ID, NOME from MEMBROS order by ID");
        while (rs.next()) {            
            Membro membro = new Membro();
            membro.setId(rs.getInt("ID"));
            membro.setNome(rs.getString("NOME"));
            listaMembro.add(membro);
        }
        rs.close();
        return listaMembro;
    }
    /*
    public List<CidadeEstado> carregaListaCidadeEstado(String text){
        List<CidadeEstado> listaCidadeEstado = new ArrayList<CidadeEstado>();
        ResultSet rs = executeQuery(text, params)
    }
    * 
    */
    
    public List<String> carregarListaIgrejas() throws SQLException{
        List<String> lista = new ArrayList<String>();
        String query = "SELECT nome FROM dbo.IGREJAS ORDER BY id";
        ResultSet rs = executeQuery(query);
        while (rs.next()) {            
            lista.add(rs.getString("nome"));
        }
        rs.close();
        return lista;
    }
}